package com.g2room.io.image;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/** 
* 
* @author Jiangpin 
*/ 
public class CompressImg {
	static String dir = "F:/资料/项目/驾车技巧/html/images/sourceImg/";
	static String targetDir = "F:/资料/项目/驾车技巧/html/images/targetImg-50/";
	 
	/**
	 * 图片压缩测试
	 * 
	 * @param args
	 */
	public static void main(String args[]) {
		compressImg(dir);
	}
	
	/** 
	* @param f 图片文件
	* @param targetDir 图片目标目录 
	* @param per 百分比 
	*/ 
	private static void  compress(File f, float per){
		Image src; 
		try {
			src = ImageIO.read(f); //构造Image对象
			String fileType = f.getName().substring(f.getName().lastIndexOf(".") + 1);
			String targetPath = targetDir + f.getPath().substring(dir.length());
			if(!fileType.equalsIgnoreCase("png") && !fileType.equalsIgnoreCase("bmp") && !fileType.equalsIgnoreCase("jpeg") && !fileType.equalsIgnoreCase("jpg")) {
				if(fileType.equalsIgnoreCase("ico")) return;
				// 直接拷贝
				copyFile(f, targetPath, false);
				return;
			}
			int w=src.getWidth(null); //得到源图宽
			int h=src.getHeight(null);
			BufferedImage tag = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);	            	              
			tag.getGraphics().drawImage(src.getScaledInstance(w, h,  Image.SCALE_SMOOTH), 0,0,null);

			dirExist(targetPath.replaceAll(f.getName(), ""));
			FileOutputStream newImage=new FileOutputStream(targetPath); //输出到文件流 
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newImage); 
			JPEGEncodeParam jep=JPEGCodec.getDefaultJPEGEncodeParam(tag); 
			/* 压缩质量 */ 
			jep.setQuality(per, true); 
			encoder.encode(tag, jep); 
			newImage.flush();
			newImage.close(); 
		} catch (Exception ex) {
			ex.printStackTrace();
		} 
 }
 
	private static void dirExist(String dir) {
	 	File file = new File(dir);
	 	if(!file.exists()) {
	 		file.mkdirs();
	 	}
	}
 
	private static void compressImg(String dir) {
		File f= new File(dir);
		for(File file : f.listFiles()) {
			if(file.isDirectory()) {
				compressImg(file.getPath());
			} else {
				//压缩
				compress(file, 0.5f);
			}
		}
	}
	
	/**
	 * 复制单个文件
	 * 
	 * @param srcFileName 待复制的文件名
	 * @param descFileName 目标文件名
	 * @param overlay 如果目标文件存在，是否覆盖
	 * @return 如果复制成功返回true，否则返回false
	 */
	public static boolean copyFile(File srcFile, String destFileName, boolean overlay) {
		// 判断源文件是否存在
		if (!srcFile.exists()) {
			return false;
		} else if (!srcFile.isFile()) {
			System.out.println("复制文件失败，源文件：" + srcFile.getPath() + "不是一个文件！");
			return false;
		}
		System.out.println(srcFile.getPath());
		// 判断目标文件是否存在
		File destFile = new File(destFileName);
		if (destFile.exists()) {
			// 如果目标文件存在并允许覆盖
			if (overlay) {
				// 删除已经存在的目标文件，无论目标文件是目录还是单个文件
				new File(destFileName).delete();
			}
		} else {
			// 如果目标文件所在目录不存在，则创建目录
			if (!destFile.getParentFile().exists()) {
				// 目标文件所在目录不存在
				if (!destFile.getParentFile().mkdirs()) {
					// 复制文件失败：创建目标文件所在目录失败
					return false;
				}
			}
		}

		// 复制文件
		int byteread = 0; // 读取的字节数
		InputStream in = null;
		OutputStream out = null;

		try {
			in = new FileInputStream(srcFile);
			out = new FileOutputStream(destFile);
			byte[] buffer = new byte[1024];

			while ((byteread = in.read(buffer)) != -1) {
				out.write(buffer, 0, byteread);
			}
			return true;
		} catch (FileNotFoundException e) {
			return false;
		} catch (IOException e) {
			return false;
		} finally {
			try {
				if (out != null)
					out.close();
				if (in != null)
					in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
} 
